home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 25 / AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso / Updates / HD-Installer / jst_dev / sources / OSEmu / dos.s < prev    next >
Text File  |  2000-04-12  |  19KB  |  982 lines

  1. ;APS00000000000000000000000000000000000000000000000000000000000000000000000000000000
  2. * $Id: dos.s 1.1 1999/02/03 04:09:58 jotd Exp $
  3. **************************************************************************
  4. *   DOS-LIBRARY                                                          *
  5. **************************************************************************
  6. **************************************************************************
  7. *   INITIALIZING                                                         *
  8. **************************************************************************
  9.  
  10. DOSINIT        move.l    _dosbase,d0
  11.         beq    .init
  12.         rts
  13.  
  14. .init        move.l    #1050,d0    ;(reserved function)
  15.         move.l    #$46,d1
  16.         lea    _dosname,a0
  17.         bsr    _InitLibrary
  18.         move.l    d0,a0
  19.         move.l    d0,_dosbase
  20.         
  21.         patch    _LVOLoadSeg(a0),DOSLOADSEG(pc)
  22.         patch    _LVOUnLoadSeg(a0),DOSUNLOADSEG(pc)
  23.         patch    _LVOOpen(a0),DOSOPEN(PC)
  24.         patch    _LVOClose(a0),DOSCLOSE(PC)
  25.         patch    _LVORead(a0),DOSLOAD(PC)
  26.         patch    _LVOWrite(a0),DOSSAVE(PC)
  27.         patch    _LVOSeek(a0),DOSSEEK(PC)
  28.         patch    _LVOLock(A0),DOSLOCK(PC)
  29.         patch    _LVOInput(A0),MYRTZ(PC)
  30.         patch    _LVOOutput(A0),MYRTZ(PC)
  31.         patch    _LVODeviceProc(A0),MYRTZ(PC)
  32.         patch    _LVOExamine(A0),_EXAMINE(PC)
  33.         patch    _LVOExNext(A0),_EXNEXT(PC)        ; added by JOTD
  34.         patch    _LVOExamineFH(A0),_EXAMINEFH(PC)    ; added by JOTD
  35.         patch    _LVOIoErr(A0),_IOERR(PC)        ; added by JOTD
  36.         patch    _LVOUnLock(A0),_DOSUNLOCK(PC)
  37.         patch    _LVOInfo(A0),DOSINFO(PC)
  38.         patch    _LVODupLock(A0),_DUPLOCK(PC)
  39.  
  40.         patch    _LVOWaitForChar(A0),MYRTZ(PC)
  41.         patch    _LVOCurrentDir(A0),MYRTZ(PC)
  42.         patch    _LVODelay(A0),DOSDELAY(PC)    ; added by JOTD
  43.         patch    _LVOAssignPath(a0),ASSIGNPATH(PC)
  44.         patch    _LVOAssignLock(a0),ASSIGNLOCK(PC)
  45.         patch    _LVORunCommand(a0),RUNCOMMAND(PC) ; added by JOTD
  46.         patch    _LVOGetArgStr(a0),GETARGSTR(PC) ; added by JOTD
  47.  
  48.         rts
  49.  
  50. **************************************************************************
  51. *   PROGRAM EXECUTION                                                    *
  52. **************************************************************************
  53.  
  54. ;<D1:SEGLIST
  55. ;<D2:STACKSIZE
  56. ;<D3:ARGPTR
  57. ;<D4:ARGSIZE
  58.  
  59. ;RUNCOMMAND will ignore STACKSIZE: it will use the current stack
  60.  
  61. RUNCOMMAND:
  62.     move.l    D3,args_ptr
  63. ;;    move.l    D4,D0
  64.  
  65.     LSL.L    #2,D1
  66.     MOVE.L    D1,A1
  67.     ADDQ.L    #4,A1
  68.  
  69.  
  70.     jmp    (A1)    ; executes the program
  71.  
  72. GETARGSTR:
  73.     move.l    args_ptr(pc),D0
  74.     rts
  75.  
  76. args_ptr:
  77.     dc.l    0
  78.  
  79. _IOERR:
  80.     move.l    last_io_error(pc),D0
  81.     move.l    #ERROR_DIR_NOT_FOUND,last_io_error
  82.     rts
  83.  
  84. last_io_error:
  85.     dc.l    0
  86.  
  87. ; ******************************************
  88. ; 2 special macros added by JOTD for LoadSeg:
  89.  
  90. ; calls EnterDebugger when a condition is reached:
  91.  
  92. BREAK_ON_COND:MACRO
  93.     cmp.l    \1,\2
  94.     bne.b    .ok\@
  95.     bsr    EnterDebugger
  96.     nop
  97.     nop
  98. .ok\@
  99.     ENDM
  100.  
  101. ; branch with call to EnterDebugger when true
  102. ; (to trap error code source)
  103.  
  104. ; uncomment to activate
  105.  
  106. ;BRANCH_COND:MACRO
  107. ;    \1    .sk\@
  108. ;    bra.b    .end\@
  109. ;.sk\@
  110. ;    bsr    EnterDebugger
  111. ;    bra    \2
  112. ;.end\@
  113. ;    ENDM
  114.  
  115. BRANCH_COND:MACRO
  116.     \1    \2    ; this is the non-debug configuration
  117.     ENDM
  118.  
  119. ;>D1:FILENAME
  120. ;<D0:FIRST SEGMENT
  121. ;INTERNAL: D7-TOTAL # OF SEGMENTS
  122. ;    D6-FILEHANDLE
  123. ;    D5-SEGMENTBASE
  124. ;    A4-8 BYTES SPACE ON STACK FOR HUNKHEADERS
  125. ;LIMITATIONS: ONLY FOLLOWING HUNKS ALLOWED: HUNK_CODE, HUNK_DATA, HUNK_BSS,
  126. ;        HUNK_END, HUNK_RELOC32, HUNK_HEADER, HUNK_DEBUG, HUNK_SYMBOL
  127. ;               CONTACT IF YOU HAVE AN EXE WITH OTHER HUNKS, IM SIMPLY MISSING 
  128. ;        THE EXAMPLES TO IMPLEMENT THEM
  129.  
  130. DOSLOADSEG:
  131.     MOVEM.L    D2-D7/A2-A4,-(A7)
  132.     SUBQ.L    #8,A7
  133.     MOVE.L    A7,A4
  134.     MOVE.L    #MODE_OLDFILE,D2
  135.     BSR.W    DOSOPEN
  136.     TST.L    D0
  137.     BRANCH_COND    BEQ.W,.ERR
  138.  
  139.     MOVE.L    D0,D6
  140.     MOVE.L    D6,D1
  141.     MOVE.L    A4,D2
  142.     MOVEQ.L    #4,D3
  143.     BSR.W    DOSLOAD
  144.     TST.L    D0
  145.     BRANCH_COND    BEQ.W,.ERR2
  146.     CMP.L    #$3F3,(A4)        ;FIRST LW=HUNK_HEADER?
  147.     BRANCH_COND    BNE.W,.ERR2
  148.     MOVE.L    D6,D1
  149.     MOVE.L    A4,D2
  150.     MOVEQ.L    #4,D3
  151.     BSR.W    DOSLOAD
  152.     TST.L    D0
  153.     BRANCH_COND    BEQ.W,.ERR2
  154.     TST.L    (A4)            ;NO NAME PLEASE
  155.     BRANCH_COND    BNE.W,.ERR2
  156.     MOVE.L    D6,D1
  157.     MOVE.L    A4,D2
  158.     MOVEQ.L    #4,D3
  159.     BSR.W    DOSLOAD
  160.     TST.L    D0
  161.     BRANCH_COND    BEQ.W,.ERR2
  162.     MOVE.L    (A4),D7            ;TOTAL # OF HUNKS
  163.     SUBQ.L    #1,D7    
  164.     MOVE.L    D6,D1
  165.     MOVE.L    A4,D2
  166.     MOVEQ.L    #8,D3
  167.     BSR.W    DOSLOAD
  168.     TST.L    D0
  169.     BRANCH_COND    BEQ.W,.ERR2
  170.     TST.L    (A4)            ;FIRST HUNK HAS TO BE 0
  171.     BRANCH_COND    BNE.W,.ERR2
  172.     CMP.L    4(A4),D7        ;LAST HUNK HAS TO BE HUNK_COUNT
  173.     BRANCH_COND    BNE.W,.ERR2
  174.  
  175.     MOVEQ.L    #0,D4            ;ALLOC MEM FOR ALL SEGMENTS
  176.     MOVEQ.L    #0,D5
  177. .1
  178.  
  179.     MOVE.L    D6,D1
  180.     MOVE.L    A4,D2
  181.     MOVEQ.L    #4,D3            ;GET SIZE AND MEMFLAGS OF HUNK
  182.     BSR.W    DOSLOAD
  183.     TST.L    D0
  184.     BRANCH_COND    BEQ.W,.ERR3
  185.  
  186.     MOVE.L    (A4),D0
  187.  
  188.     ; added by JOTD: check memtype requirement
  189.  
  190.     bsr    .getmemflag    ; >D1: MEMF_xxx
  191.  
  192.     ; compute mem size
  193.  
  194.     LSL.L    #2,D0
  195.     ADDQ.L    #8,D0
  196.     MOVE.L    D0,D2            ;ALLOC MEM IN SIZE
  197.     ADDQ.L    #7,D0
  198.     AND.L    #$FFFFFFF8,D0
  199.  
  200.     BSR.W    ALLOCM
  201.     TST.L    D0
  202.     BRANCH_COND    BEQ.W,.ERR3
  203.     MOVE.L    D0,A3
  204.     MOVE.L    D2,(A3)
  205.     CLR.L    4(A3)
  206.  
  207.     TST.L    D4
  208.     BNE.S    .2
  209.     MOVE.L    D0,D5            ;D5-POINTER TO 1ST SEGMENT
  210.     BRA.S    .3
  211.  
  212. .2
  213.     MOVE.L    D5,A3            ;POINTER TO 1ST SEGMENT
  214. .5    TST.L    4(A3)
  215.     BEQ.S    .4
  216.     MOVE.L    4(A3),D2        ;NEXT SEGMENT
  217.     LSL.L    #2,D2
  218.     SUBQ.L    #4,D2
  219.     MOVE.L    D2,A3
  220.     BRA.S    .5
  221.  
  222.  
  223. .4    ADDQ.L    #4,D0
  224.     LSR.L    #2,D0
  225.     MOVE.L    D0,4(A3)
  226. .3    ADDQ.L    #1,D4
  227.     CMP.L    D7,D4
  228.     BLS.S    .1
  229.                     ;HEADER COMPLETE, MEM ALLOCATED
  230.  
  231.             ;NOW PROCESSING THE HUNK_CODE, HUNK_DATA AND HUNK_BSS
  232.     MOVEQ.L    #0,D4
  233. .HN    MOVE.L    D6,D1
  234.     MOVE.L    A4,D2
  235.     MOVEQ.L    #4,D3            ;GET TYPE OF HUNK
  236.     BSR.W    DOSLOAD
  237.     TST.L    D0
  238.     BRANCH_COND    BEQ.W,.ERR3    ;END OF FILE ENCOUNTERED
  239. .MAINHUNKS:
  240.     AND.L    #$3FFFFFFF,(A4)
  241.     CMP.L    #$3E9,(A4)        ;HUNK_CODE?
  242.     BEQ.W    .HCD
  243.     CMP.L    #$3F1,(A4)        ;HUNK_DEBUG?
  244.     BEQ.S    .HDEBUG1
  245.     CMP.L    #$3EA,(A4)        ;HUNK_DATA?
  246.     BEQ.S    .HCD
  247.     CMP.L    #$3EB,(A4)        ;HUNK_BSS?
  248.     BEQ.S    .HBSS
  249.     BRANCH_COND    BRA.W,.ERR3
  250.  
  251.     ; debug hunk support, added by JOTD
  252. .HDEBUG1:
  253.     bsr.s    .HDEBUG
  254.     BRA.W    .HN
  255.  
  256. .HDEBUG2
  257.     bsr.s    .HDEBUG
  258.     bra    .INNERHUNK
  259.     
  260. .HDEBUG:
  261.     MOVE.L    D6,D1
  262.     MOVE.L    A4,D2
  263.     MOVEQ.L    #4,D3
  264.     BSR.W    DOSLOAD            ;GET HUNK LENGTH
  265.     MOVE.L    (A4),D0
  266.     add.l    D0,D0
  267.     add.l    D0,D0
  268.  
  269.     MOVE.L    D6,D1
  270.     MOVE.L    D0,D2
  271.     MOVE.L    #OFFSET_CURRENT,D3
  272.     BSR.W    DOSSEEK            ;SKIP DEBUG DATA
  273.     CMP.L    #-1,D0
  274.     BRANCH_COND    BEQ.W,.ERR3
  275.     RTS
  276.  
  277. .HBSS    
  278.     MOVE.L    D6,D1            ;BSS-HUNK
  279.     MOVE.L    A4,D2
  280.     MOVEQ.L    #4,D3            ;IGNORE SIZE OF HUNK
  281.     BSR.W    DOSLOAD
  282.     TST.L    D0
  283.     BRANCH_COND    BEQ.W,.ERR3
  284.     BRA.S    .INNERHUNK
  285.  
  286. .HCD
  287.     MOVE.L    D6,D1            ;CODE- AND DATA-HUNK
  288.     MOVE.L    A4,D2
  289.     MOVEQ.L    #4,D3            ;GET SIZE OF HUNK
  290.     BSR.W    DOSLOAD
  291.     TST.L    D0
  292.     BRANCH_COND    BEQ.W,.ERR3
  293.     MOVE.L    (A4),D3            ;LEN OF HUNK
  294.     beq    .INNERHUNK        ; added by JOTD, hunk code can be of 0 length
  295.     LSL.L    #2,D3
  296.     MOVE.L    D4,D1            ;ACTUAL HUNK
  297.     MOVE.L    D5,A3            ;START OF 1ST SEGMENT
  298.     BRA.S    .HCD1
  299.  
  300. .HCD2    MOVE.L    4(A3),D2
  301.     LSL.L    #2,D2
  302.     SUBQ.L    #4,D2
  303.     MOVE.L    D2,A3
  304. .HCD1    DBF    D1,.HCD2
  305.     MOVE.L    A3,D2
  306.     ADDQ.L    #8,D2
  307.     MOVE.L    D6,D1
  308.  
  309.     BSR.W    DOSLOAD
  310.     TST.L    D0
  311.     BRANCH_COND    BEQ.W,.ERR3
  312.  
  313. .INNERHUNK:
  314.     MOVE.L    D6,D1
  315.     MOVE.L    A4,D2
  316.     MOVEQ.L    #4,D3            ;GET TYPE OF HUNK
  317.     BSR.W    DOSLOAD
  318.     TST.L    D0
  319.     BRANCH_COND    BEQ.W,.ERR3
  320.     CMP.L    #$3EC,(A4)        ;HUNK_RELOC32?
  321.     BEQ.S    .HRELOCT
  322.     CMP.L    #$3F2,(A4)        ;HUNK_END?
  323.     BEQ.W    .HENDT
  324.     CMP.L    #$3F0,(A4)        ;HUNK_SYMBOL?
  325.     BEQ.W    .HSYMBOLT
  326.     CMP.L    #$3F1,(A4)        ;HUNK_DEBUG?
  327.     BEQ.W    .HDEBUG2
  328.     BRANCH_COND    BRA.W,.ERR3
  329.  
  330. .HRELOCT
  331.     MOVE.L    D6,D1
  332.     MOVE.L    A4,D2
  333.     MOVEQ.L    #4,D3            ;GET COUNT OF LW-RELOCS
  334.     BSR.W    DOSLOAD
  335.     TST.L    D0
  336.     BRANCH_COND    BEQ.W,.ERR3
  337.     TST.L    (A4)            ;END OF RELOCATION?
  338.     BEQ.S    .INNERHUNK
  339.     MOVE.L    D6,D1
  340.     MOVE.L    A4,D2
  341.     ADDQ.L    #4,D2
  342.     MOVEQ.L    #4,D3            ;GET CORRESPONDING HUNK TO RELOCATE TO
  343.     BSR.W    DOSLOAD
  344.     TST.L    D0
  345.     BRANCH_COND    BEQ.W,.ERR3
  346.  
  347.     MOVE.L    (A4),D0
  348.  
  349.     bsr    .getmemflag
  350.  
  351.     LSL.L    #2,D0            ;ALLOC MEM OF SIZE OF RELOCTABLE
  352.     ADDQ.L    #7,D0
  353.     AND.L    #$FFFFFFF8,D0
  354.  
  355.     BSR.W    ALLOCM
  356.     TST.L    D0
  357.     BRANCH_COND    BEQ.W,.ERR4
  358.     MOVE.L    D0,A2
  359.     MOVE.L    D6,D1
  360.     MOVE.L    A2,D2
  361.     MOVE.L    (A4),D3            ;GET CORRESPONDING RELOCS TO RELOCATE
  362.     LSL.L    #2,D3
  363.     BSR.W    DOSLOAD
  364.     TST.L    D0
  365.     BRANCH_COND    BEQ.W,.ERR4
  366.     MOVE.L    (A4),D3            ;# OF RELOCS
  367.     MOVE.L    4(A4),D2        ;WHICH HUNK TO RELOCATE TO?
  368.     MOVE.L    D5,A0
  369.     BRA.S    .HRELOCT3
  370.  
  371. .HRELOCT4
  372.     MOVE.L    4(A0),D0
  373.     LSL.L    #2,D0
  374.     SUBQ.L    #4,D0
  375.     MOVE.L    D0,A0
  376. .HRELOCT3
  377.     DBF    D2,.HRELOCT4        
  378.  
  379.     ADDQ.L    #8,A0
  380.     MOVE.L    A0,D0            ;GOT THE HUNK TO RELOCATE TO
  381.     LEA.L    8(A3),A1        ;THIS HUNK WILL BE RELOCATED
  382.     MOVE.L    A2,A0            ;HERE ARE THE RELOCS
  383.     BRA.S    .HRELOCT5
  384.  
  385. .HRELOCT6
  386.     MOVE.L    (A0)+,D1
  387.     ADD.L    D0,(A1,D1.L)
  388. .HRELOCT5
  389.     DBF    D3,.HRELOCT6
  390.     MOVE.L    A2,A1            ;FREE THE MEM OF SIZE OF RELOCTABLE
  391.     MOVE.L    (A4),D0
  392.     LSL.L    #2,D0
  393.     ADDQ.L    #7,D0
  394.     AND.L    #$FFFFFFF8,D0
  395.     BSR.W    FREEM
  396.     BRA.W    .HRELOCT
  397.  
  398. .HSYMBOLT
  399.     MOVE.L    D6,D1
  400.     MOVE.L    A4,D2
  401.     MOVEQ.L    #4,D3
  402.     BSR.W    DOSLOAD            ;GET NAMELENGTH
  403.     TST.L